package models

import (
	"GoTime/response"
	"fmt"

	"xorm.io/builder"
)

type Field struct {
	Id              int    `xorm:"not null pk autoincr comment('自增主键') INT(11)" form:"field_id"`                                              // 自增主键ID
	SchoolId        int    `xorm:"not null comment('驾校id外键关联dts_school中的id') index INT(11)" form:"school_id"`                                 // 学校ID外键
	FieldCode       string `xorm:"default '' comment('教学区域名称 训练场编号各驾校可按照自行规则制定') VARCHAR(4)" form:"field_code"`                               // 教学区域代码
	Address         string `xorm:"not null comment('训练场地址') VARCHAR(512)" form:"address"`                                                     // 训练场地址
	Name            string `xorm:"comment('教学区域名称') VARCHAR(255)" form:"name"`                                                                // 教学区域名称
	Type            string `xorm:"not null default '1' comment('教学区域类型 1：第二部分；2：第三部分') ENUM('1','2','3','4')" form:"type"`                    // 教学区域类型
	TrainingCarType string `xorm:"not null comment('培训车型  A1,A2,A3,B1,B2,C1,C2,C3,C4,C5,D,E,F,M,N,P') VARCHAR(512)" form:"training_car_type"` // 培训车型
	Area            int    `xorm:"default 0 comment('训练场地面积') INT(11)" form:"area"`                                                           // 训练场地面积
	Totalvehnum     int    `xorm:"default 0 comment('可容纳车辆数') INT(11)" form:"totalvehnum"`                                                    // 可容纳车辆数
	Curvehnum       int    `xorm:"default 0 comment('已投放车辆数') INT(11)" form:"curvehnum"`                                                      // 已投放车辆数
	Description     string `xorm:"comment('训练场描述信息') VARCHAR(128)" form:"description"`                                                        // 训练场描述信息
	ApprovalStatus  string `xorm:"default '0' comment('训练场地提交运管审核状态，0:待审核，1:通过审核，2:未通过审核') ENUM('0','1','2')"`                                // 审批状态
	RecordStatus    string `xorm:"not null default '0' comment('备案状态 0:未备案 1:已备案') ENUM('0','1')"`                                            // 备案状态
	Isused          string `xorm:"default '1' comment('0 已删除  1未删除') ENUM('0','1')"`                                                          // 是否使用
	InstitutionCode string `xorm:"CHAR(16) default ''"`                                                                                       // 机构代码
	Reason          string `xorm:"CHAR(255) default ''"`                                                                                      // 原因
	Remark          string `xorm:"VARCHAR(255) default ''"`                                                                                   // 备注
}

func (f *Field) GetFieldList(filter builder.Cond, pageSize, offset int) (count int64, fieldList []response.FieldListResponse, err error) {
	err = engine.Table("dts_field").Alias("f").
		Where("f.isused = ?", "1").And(filter).
		Limit(pageSize, offset).Desc("f.id").
		Find(&fieldList)
	count, err = engine.Table("dts_field").Alias("f").
		Select("COUNT(f.id)").
		Where("f.isused = ?", "1").And(filter).
		Count()
	return
}

func (f *Field) GetClosurePoint(schoolId, id string) (list []*response.ClosurePointResponse, err error) {
	sess := engine.Table("dts_field").Alias("f").
		Select("dcp.latitude,dcp.longitude,dcp.order,dcp.id,dcp.closure_id").Join("LEFT", []string{"dts_closure", "dc"}, "dc.field_id=f.id").
		Join("LEFT", []string{"dts_closure_point", "dcp"}, "dcp.closure_id=dc.id").
		Where("f.school_id=? and f.id=?", schoolId, id).Asc("dcp.order")
	if err = sess.Find(&list); err != nil {
		fmt.Println(err.Error())
		return list, err
	}
	return list, err
}

func (f *Field) GetOneFieldById(id string) (list Field, err error) {
	_, err = engine.Table("dts_field").
		Where("id = ? and isused = ?", id, "1").
		Get(&list)
	return list, err
}

func (f *Field) Update(field ...string) bool {
	var (
		err error
	)
	_, err = engine.ID(f.Id).Cols(field...).Update(f)
	if err != nil {
		return false
	}
	return true
}

func (f *Field) CheckLastFieldCode(schoolId string) (has bool, field Field, err error) {
	has, err = engine.Table("dts_field").Where("school_id = ?", schoolId).Desc("field_code").Get(&field)
	return has, field, err
}
